<?php
/**
 * Controller_Building
 *
 * Класс отвечает за обработку страниц зданий
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.1
 */
class Controller_Building extends Controller_BaseGameController {


	/**
	 * Выбор действия по URL
	 */
	public function action() {
		$objGeneral = Game_General::instance();
		switch ($this->arrRequest[1]) {
			case 'create': 
				$positionId = intval($this->arrRequest[2]);
				if (empty($positionId)) $this->setError(404);
				if (!$this->_isBuildingPositionCorrect($positionId)) $this->setError(404);
				$objPlaceBuiding = new Game_PlaceBuilding($objGeneral->objPlace->id, $positionId);
				if ($objPlaceBuiding->isLoaded()) User_Session::moveTo(W_ABSPATH, Service_Translate::getText('Здесь здание уже строится'));
				$this->_actionCreate($positionId);
				break;
			default:
				$positionId = intval($this->arrRequest[1]);
				if (!$this->_isBuildingPositionCorrect($positionId)) $this->setError(404);
				
				$objPlaceBuiding = new Game_PlaceBuilding($objGeneral->objPlace->id, $positionId);
				$this->_actionShowInfo($objPlaceBuiding);
				break;
		}
	}

	/**
	 * Экран создания здания
	 *
	 * @param int $positionId - идентификатор позиции для постройки здания
	 */
	private function _actionCreate($positionId) {
		$this->_chechCreateAndDoItIfNeed($positionId);
		
		$objGeneral = Game_General::instance();
		//$arrBuildings = $objGeneral->objPlace->getBuildingsToBeCreate();
		$arrBuildingsStatuses = Game_Building_Status::getPlaceBuildingsStatuses();
		$this->title = $this->pageHead = Service_Translate::getText('Построить здание');
		$this->showHeader();
			View_Special_Building::showListCouldBeCreate($arrBuildingsStatuses, $positionId);
		$this->showFooter();
	}


	/**
	 * Отображение информации о здании
	 * 
	 * @param Game_PlaceBuilding $objPlaceBuiding - объект связи места со зданием для отображения
	 */
	private function _actionShowInfo(Game_PlaceBuilding $objPlaceBuiding) {
		$objGeneral = Game_General::instance();
		
		
		$this->_checkUpgadeAndDoItIfNeed($objPlaceBuiding);
		$this->_checkBuildingsSubActionsAndDoIfNeed($objPlaceBuiding);
		
		$this->title = $this->pageHead = $objPlaceBuiding->objBuilding->getBuildingName($objPlaceBuiding->objBuilding->id);
		$this->showHeader();
			View_Special_Building::showBuildingPage($objPlaceBuiding);
			if ($objPlaceBuiding->objBuilding->id == 10) $this->_subActionAcademy($objPlaceBuiding);
			if (in_array($objPlaceBuiding->objBuilding->id, array(11, 12, 13))) $this->_subActionMilitary($objPlaceBuiding);
		$this->showFooter();
	}
	
	/**
	 * Обработка академии
	 *
	 * @param Game_PlaceBuilding $objPlaceBuiding - объект связи места со зданием для отображения
	 */
	private function _subActionAcademy(Game_PlaceBuilding $objPlaceBuiding) {
		$objGeneral = Game_General::instance();
		$arrUnits = $objGeneral->objPlace->getUnitsStatuses();
		
		View_Special_Unit::showListCouldBeResearch($arrUnits);
	}
	
	/**
	 * Обработка академии
	 *
	 * @param Game_PlaceBuilding $objPlaceBuiding - объект связи места со зданием для отображения
	 */
	private function _subActionMilitary(Game_PlaceBuilding $objPlaceBuiding) {
		$objGeneral = Game_General::instance();
		// Определяем тип военного здания, с которым мы работаем
		$militaryBuildingType = 0;
		switch ($objPlaceBuiding->objBuilding->id) {
			case 11: $militaryBuildingType = 1; break;
			case 12: $militaryBuildingType = 2; break;
			case 13: $militaryBuildingType = 3; break;
		}
		$arrUnits = $objGeneral->objPlace->getUnitsStatuses();
		
		View_Special_Unit::showListCouldBeCreate($arrUnits, $objPlaceBuiding, $militaryBuildingType);
	}

	
	/**
	 * Проверяет, корректное ли здание хочет посмотреть пользователь
	 * 
	 * @param int $positionId - номер позиции здания
	 * @return boolean
	 */
	private function _isBuildingPositionCorrect($positionId) {
		if (empty($positionId) || $positionId > 40) return false;
	}
	
	/**
	 * Проверяет, не требуется ли апгрейд зданию и при необходимости делает его
	 * 
	 * @param Game_PlaceBuilding $objPlaceBuilding - объект связи места со зданием для отображения
	 */
	private function _checkUpgadeAndDoItIfNeed(Game_PlaceBuilding $objPlaceBuilding) {
		if (empty($_GET['upgrade'])) return false;
		$levelToUpgradeWant = Service_Escape::requestDataInt('upgrade', 'GET');
		if (empty($levelToUpgradeWant)) return false;
		
		/*
		if ($objPlaceBuilding->upgradeToLevel($levelToUpgradeWant)) {
			User_Session::moveToSamePage(); // Обновляем пользователю страницу
		}*/
		
		try {
			if ($objPlaceBuilding->upgradeToLevel($levelToUpgradeWant)) {
				User_Session::moveToSamePage(); // Обновляем пользователю страницу
			}
		}
		catch (Exception_Game $e) {
			User_Session::moveToSamePage($e->getMessage());
		}
	}
	
	/**
	 * Проверяет, не требуется ли обработка частного события какого-нибудь здания
	 * 
	 * @param Game_PlaceBuilding $objPlaceBuilding - объект связи места со зданием для отображения
	 */
	private function _checkBuildingsSubActionsAndDoIfNeed(Game_PlaceBuilding $objPlaceBuilding) {
		if (!empty($_GET['research'])) $this->_makeResearch();
		if (!empty($_POST['cu'])) $this->_makeUnitsCreating();
	}

	/**
	 * Делает обработку создания исследования
	 */
	private function _makeResearch() {
		// Определяем, какой unit необходимо исследовать
		$unitId = Service_Escape::requestDataInt('research', 'GET');
		$objUnitStatus = Game_Unit_Status::getPlaceUnitStatus($unitId);
		if(empty($objUnitStatus)) User_Session::moveToSamePage(); // Если Url оказался бредовым, то отправляем пользователя на основную страницу
	
		try {
			if ($objUnitStatus->research()) User_Session::moveToSamePage(); // Обновляем пользователю страницу
		}
		catch (Exception_Game $e) {
			User_Session::moveToSamePage($e->getMessage());
		}
	
	}
	

	/**
	 * Делает обработку создания юнитов
	 */
	private function _makeUnitsCreating() {
		// Определяем, какой unit необходимо исследовать
		$arrUnits = Service_Escape::requestDataArray('cu', 'POST');
		$arrUnits = Service_Escape::intEscapeArray($arrUnits);
		echo '<pre>';
			print_r($arrUnits);
		echo '</pre>';
		$wasBuiltSomething = 0;
		$wasExceptions = 0;
		foreach ($arrUnits as $unitId => $unitsAmount) {
			if (!$unitsAmount) continue;
			$objUnit = new Game_Unit($unitId);
			if (!$objUnit->id) continue;
			try {
				$objUnit->createUnits($unitsAmount);
				$wasBuiltSomething++;
			}
			catch (Exception_Game $e) {
				$wasExceptions++;
				//User_Session::moveToSamePage($e->getMessage());
			}
		}
		//User_Session::moveToSamePage();
	}
	
	
	/**
	 * Проверяет, не требуется ли постройка здания. И строит его при необходимости
	 * 
	 * @param int $positionId
	 */
	private function _chechCreateAndDoItIfNeed($positionId) {
		$buildingId = Service_Escape::requestDataInt('ID_building', 'GET');
		if (empty($buildingId) || empty($positionId)) return false;
		$objGeneral = Game_General::instance();
		$objPlaceBuilding = new Game_PlaceBuilding($objGeneral->objPlace->id, $positionId);
		$objPlaceBuilding->objBuilding = new Game_Building($buildingId);
		$objPlaceBuilding->setField('ID_building', $buildingId);
		$objPlaceBuilding->setField('level', 0);

		try {
			if ($objPlaceBuilding->createBuilding()) {
				User_Session::moveToSamePage(); // Обновляем пользователю страницу
			}
		}
		catch (Exception_Game $e) {
			User_Session::moveToSamePage($e->getMessage());
		}
	}
	

}
?>